from fdfs_client.client import Fdfs_client
from django.core.files.storage import Storage
from django.conf import settings


class FastDFSStorage(Storage):
    """自定义文件存储系统"""

    def __init__(self, base_url=None, client_conf=None):
        """初始化方法"""
        # if client_conf:
        #     self.client_conf = client_conf
        # else:
        #     self.client_conf = settings.FDFS_CLIENT_CONF
        # self.client_conf = client_conf if client_conf else settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf or settings.FDFS_CLIENT_CONF

        self.base_url = base_url or settings.FDFS_BASE_URL

    def _open(self, name, mode='rb'):
        """
        打开storage中上传的文件文件, 我们孩子是上传文件 不需要打开 但是官方要求必须重写
        :param name: 表示打开的文件名
        :param mode: 打开文件的模式read bytes
        :return:
        """
        pass

    def _save(self, name, content):
        """
        在FastDFS中保存文件
        :param name: 传入的文件名
        :param content: 文件内容
        :return: 保存到数据库中的FastDFS的文件名
        """
        # 1. 创建client 客户端
        # client = Fdfs_client('meiduo/utils/fastdfs/client.conf')
        client = Fdfs_client(self.client_conf)

        # 2.上传文件到fastdfs
        # 此方法上传文件到storage中有文件后缀
        # ret = client.upload_appender_by_filename('此方法之恩那个吐过绝对路径来上传')

        # 无后缀
        ret = client.upload_appender_by_buffer(content.read())
        # {'Group name': 'group1', 'Remote file_id': 'group1/M00/00/02/CtM3BVr-k6SACjAIAAJctR1ennA809.png',
        # 'Status': 'Upload successed.', 'Local file name': '/Users/delron/Desktop/1.png', 'Uploaded size':
        # '151.00KB', 'Storage IP': '10.211.55.5'}

        # 3. 判断上传是否成功
        if ret.get('Status') != 'Upload successed.':
            raise Exception('upload file failed')
        file_name = ret.get('Remote file_id')
        return file_name

    def exists(self, name):
        """
        判断文件是否存在，FastDFS可以自行解决文件的重名问题
        所以此处返回False，告诉Django上传的都是新文件
        :param name:  文件名
        :return: False
        """
        return False

    def url(self, name):
        """
        返回文件的完整URL路径
        :param name: 数据库中保存的文件名
        :return: 完整的URL
        """
        # return 'http://192.168.19.106/' + name
        return self.base_url + name